//class Solution {
//public:
//    /**
//     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
//     *
//     *
//     * @param arr int整型vector the array
//     * @return int整型
//     */
//    int maxLength(vector<int>& arr) {
//        // write code here
//        // unordered_set<int> st;
//        // int sum = 0;
//        // int j = 0;
//        // for (int i = 0; i < arr.size(); i++) {
//        //     st.insert(arr[i]);
//        //     j = i + 1;
//        //     while (j < arr.size()) {
//        //         if (st.find(arr[j]) == st.end()) {
//        //             st.insert(arr[j]);
//        //             j++;
//        //         }
//        //         else{
//        //             break;
//        //         }
//        //     }
//        //     sum = max(sum, j - i);
//        //     st.clear();
//        // }
//        // return sum;
//
//        unordered_set<int> st;
//        int sum = 0;
//        int j = 0;
//        for (int i = 0; i < arr.size(); i++) {
//            if (i)
//            {
//                st.erase(arr[i - 1]);
//            }
//            while (j < arr.size() && st.find(arr[j]) == st.end())
//            {
//                st.insert(arr[j]);
//                ++j;
//            }
//            sum = max(sum, j - i);
//            if (j == arr.size())
//            {
//                break;
//            }
//        }
//        return sum;
//    }
//};




//class Solution {
//public:
//    /**
//     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
//     *
//     *
//     * @param str string字符串
//     * @return string字符串
//     */
//    struct Compare {
//        bool operator()(const pair<char, int>& a, const pair<char, int>& b) {
//            return a.second < b.second;
//        }
//    };
//    string rearrangestring(string str) {
//        // write code here
//        if (str.size() == 1)
//        {
//            return str;
//        }
//        priority_queue<pair<char, int>, vector<pair<char, int>>, Compare> pq;
//        unordered_map<char, int> mp;
//        for (int i = 0; i < str.size(); i++) {
//            mp[str[i]]++;
//        }
//        for (const auto& it : mp) {
//            pq.push(it);
//        }
//        /*while (!pq.empty())
//        {
//            cout << pq.top().first << " " << pq.top().second << endl;
//            pq.pop();
//        }
//        return 0;*/
//        if (pq.size() == 1) {
//            return "";
//        }
//        string qq;
//        int o = 0;
//        while (!pq.empty()) {
//            pair<char, int> st1 = pq.top();
//            pq.pop();
//            if (st1.second == 0) {
//                break;
//            }
//            pair<char, int> st2 = pq.top();
//            pq.pop();
//            if (st2.second == 0)
//            {
//                if (st1.second > 1)
//                {
//                    o = 1;
//                    break;
//                }
//                else {
//                    qq += st1.first;
//                    break;
//                }
//            }
//            qq += (st1.first);
//            qq += (st2.first);
//            st1.second -= 1;
//            st2.second -= 1;
//            pq.push(st1);
//            pq.push(st2);
//        }
//        if (o) {
//            return "";
//        }
//        else {
//            return qq;
//        }
//    }
//};

//#include <iostream>
//#include<queue>
//#include<unordered_map>
//using namespace std;
//struct Compare {
//    bool operator()(const pair<char, int>& a, const pair<char, int>& b) {
//        return a.second < b.second;
//    }
//};
//int main() {
//    priority_queue<pair<char, int>, vector<pair<char, int>>, Compare> pq;
//    unordered_map<char, int> mp;
//    int n;
//    cin >> n;
//    string s;
//    cin >> s;
//    if (s.size() == 1) {
//        cout << "yes" << endl;
//        cout << s;
//    }
//    for (int i = 0; i < s.size(); i++) {
//        mp[s[i]]++;
//    }
//    for (const auto& it : mp) {
//        pq.push(it);
//    }
//    if (pq.size() == 1) {
//        cout << "no" << endl;
//        return 0;
//    }
//    string qq;
//    int o = 0;
//    while (!pq.empty()) {
//        pair<char, int> st1 = pq.top();
//        pq.pop();
//        if (st1.second == 0) {
//            break;
//        }
//        pair<char, int> st2 = pq.top();
//        pq.pop();
//        if (st2.second == 0) {
//            if (st1.second > 1) {
//                o = 1;
//                break;
//            }
//            else {
//                qq += st1.first;
//                break;
//            }
//        }
//        qq += (st1.first);
//        qq += (st2.first);
//        st1.second -= 1;
//        st2.second -= 1;
//        pq.push(st1);
//        pq.push(st2);
//    }
//    if (o) {
//        cout << "no" << endl;
//    }
//    else {
//        cout << "yes" << endl;
//        cout << qq;
//    }
//    return 0;
//}

//class Solution {
//public:
//    /**
//     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
//     *
//     *
//     * @param str string字符串
//     * @return string字符串
//     */
//    struct Compare {
//        bool operator()(const pair<char, int>& a, const pair<char, int>& b) {
//            return a.second < b.second;
//        }
//    };
//
//    string rearrangestring(string str) {
//        priority_queue<pair<char, int>, vector<pair<char, int>>, Compare> pq;
//        unordered_map<char, int> mp;
//        for (int i = 0; i < str.size(); i++) {
//            mp[str[i]]++;
//        }
//        for (const auto& it : mp) {
//            pq.push(it);
//        }
//
//        string result;
//        while (!pq.empty()) {
//            pair<char, int> first = pq.top();
//            pq.pop();
//            if (pq.empty()) {
//                if (first.second > 1) {
//                    return "";
//                }
//                else {
//                    result += first.first;
//                    break;
//                }
//            }
//            pair<char, int> second = pq.top();
//            pq.pop();
//            result += first.first;
//            result += second.first;
//            first.second--;
//            second.second--;
//            if (first.second > 0) {
//                pq.push(first);
//            }
//            if (second.second > 0) {
//                pq.push(second);
//            }
//        }
//        return result;
//    }
//};

#include <iostream>
#include<queue>
#include<unordered_map>
using namespace std;
struct Compare {
    bool operator()(const pair<char, int>& a, const pair<char, int>& b) {
        return a.second < b.second;
    }
};
int main() {
    priority_queue<pair<char, int>, vector<pair<char, int>>, Compare> pq;
    unordered_map<char, int> mp;
    int n;
    cin >> n;
    string s;
    cin >> s;
    for (int i = 0; i < s.size(); i++) {
        mp[s[i]]++;
    }
    for (const auto& it : mp) {
        pq.push(it);
    }
    if (pq.size() == 1) {
        cout << "no" << endl;
        return 0;
    }
    vector<char> qq;
    int o = 0;
    string result;
    while (!pq.empty()) {
        pair<char, int> first = pq.top();
        pq.pop();
        if (pq.empty()) {
            if (first.second > 1) {
                o = 1;
                break;
            }
            else {
                result += first.first;
                break;
            }
        }
        pair<char, int> second = pq.top();
        pq.pop();
        result += first.first;
        result += second.first;
        first.second--;
        second.second--;
        if (first.second > 0) {
            pq.push(first);
        }
        if (second.second > 0) {
            pq.push(second);
        }
    }
    if (o) {
        cout << "no" << "\n";
    }
    else {
        cout << "yes" << endl;
        cout << result;
    }
    return 0;
}